home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: C/C++ / Resource for Source - C-C++.iso / misc_src / knowhow4 / paint.cpp < prev    next >
C/C++ Source or Header  |  1995-11-01  |  2KB  |  104 lines

  1. #include <math.h>
  2. #include <alloc.h>
  3. #include "paint.h"
  4.  
  5.  
  6. Stack::Stack()
  7.     {
  8.     used = 0;
  9.     total = R_STEP;
  10.     if((list = (RInfo*)malloc(R_STEP * sizeof(RInfo))) == NULL)
  11.     kh_error_code = KH_MEMORY_ERROR;
  12.     }
  13. //////////////
  14. Stack::~Stack()
  15.     {
  16.     delete list;
  17.     }
  18. /////////////
  19. void Stack::push(RInfo* r)
  20.     {
  21.     if(total < used)
  22.     list = (RInfo*)realloc(list,
  23.                (total += R_STEP) * sizeof(RInfo));
  24.     list[used].center = r->center;
  25.     list[used].angle = r->angle;
  26.     used++;
  27.     }
  28. ////////////
  29. void Stack::pop()
  30.     {
  31.     if(total - used > 2 * R_STEP)
  32.     list = (RInfo*)realloc(list,
  33.         (total -= R_STEP) * sizeof(RInfo));
  34.     used--;
  35.     }
  36. ////////////
  37. void Stack::flash()
  38.     {
  39.     used = 0;
  40.     list = (RInfo*)realloc(list, (total = R_STEP) * sizeof(RInfo));
  41.     }
  42.  
  43. /////////////////////////////////////////////////
  44. /////////////////////////////////////////////////
  45. Paint::Paint() : BGI_Font(), Trigonometry()
  46.     {
  47.     zoom = loc(100, 100); add_zoom = loc(100, 100);
  48.     lt = add_scroll = loc(0, 0); fill = OFF; center = loc(0, 0);
  49.     alpha = 0; kh_error_code = KH_SUCCESS; R_STACK = OFF;
  50.     r_stack = new Stack(); mirror = 0;
  51.     }
  52. //////////////////////////
  53. void Paint::rotate(loc c, int a)
  54.     {
  55.     center = c;
  56.     alpha = a;
  57.     if(R_STACK == ON)
  58.     {
  59.     RInfo r;
  60.     r.center = c;
  61.     r.angle = a;
  62.     r_stack->push(&r);
  63.     }
  64.     }
  65. /////////////
  66. loc Paint::rot(int x, int y)
  67.     {
  68.     int cx = center.X;
  69.     int a = alpha;
  70.     if(mirror > 0)
  71.     {
  72.     cx = mirror + mirror - cx;
  73.     a = -a;
  74.     }
  75.     int x1;
  76.     x1 = cx + (long)(x - cx) * cos(a) / 1000
  77.     + (long)(y - center.Y) * sin(a) / 1000;
  78.     y = center.Y - (long)(x - cx) * sin(a) / 1000
  79.     + (long)(y - center.Y) * cos(a) / 1000;
  80.  
  81.     return loc(x1, y);
  82.     }
  83. /////////////////////////
  84. loc Paint::transform(int x, int y)
  85.     {
  86.     if(mirror > 0)
  87.     x = mirror + mirror - x;
  88.     loc from(x, y);
  89.     if(R_STACK == OFF)
  90.     from = rot(x, y);
  91.     else
  92.     for(int i = 0; i < r_stack->used; i++)
  93.         {
  94.         alpha = r_stack->list[i].angle;
  95.         center = r_stack->list[i].center;
  96.         from = rot(from.X, from.Y);
  97.         }
  98.     loc l = lt - add_scroll;
  99.  
  100.     return loc((long)(from.X + l.X) * zoom.X / 100,
  101.            (long)(from.Y + l.Y) * zoom.Y / 100);
  102.     }
  103. ////////////////////
  104.